const Redis = require('ioredis');

// ioredis 默认支持 Promise，不需要 promisify
const client = new Redis({
    host: process.env.REDIS_HOST || 'localhost',
    port: process.env.REDIS_PORT || 6379,
    // 可选额外配置
    retryStrategy: (times) => {
        const delay = Math.min(times * 50, 2000);
        return delay;
    },
    maxRetriesPerRequest: 3
});

class Cache{
    /**
     * 从缓存获取值
     * @param {string} key - 缓存键
     * @returns {Promise<string|null>} 缓存值或null
     */
    async get(key) {
        try {
            return await client.get(key);
        } catch (error) {
            console.error('Redis 获取错误:', error);
            return null;
        }
    }

    /**
     * 设置缓存值
     * @param {string} key - 缓存键
     * @param {string} value - 缓存值
     * @param {number} ttl - 过期时间(秒，默认1小时)
     * @returns {Promise<void>}
     */
    async set(key, value, ttl = 3600) {
        try {
            // ioredis 的 setex 用法
            await client.setex(key, ttl, value);
        } catch (error) {
            console.error('Redis 设置错误:', error);
        }
    }

    /**
     * 删除缓存键
     * @param {string} key 
     * @returns {Promise<void>}
     */
    async del(key) {
        try {
            await client.del(key);
        } catch (error) {
            console.error('Redis 删除错误：', error);
        }
    }
}

module.exports = new Cache()